package com.example.demo_springboot;

import com.example.demo_springboot.dao.BookDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;


//这个类会在应用启动的时候,即DemoSpringbootApplication 启动后,马上执行(同Demo)
//平常开发中有可能需要实现在项目启动后执行的功能，SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口，实现功能的代码放在实现的run方法中
//SpringBoot在项目启动后会遍历所有实现CommandLineRunner的实体类并执行run方法，如果需要按照一定的顺序去执行，那么就需要在实体类上使用一个
// @Order注解（或者实现Order接口）来表明顺序

//@Component //注释关闭测试
//@Order(1)
public class AppRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);

    private final BookDao bookDao;

    public AppRunner(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    //测试效果
    //如果启动类未开启缓存  配置: @EnableCaching //开启缓存 , 则下方日志会间隔3秒逐条打印输出,操作过程类同数据库查询操作,即使用数据库查询缓存
    //注意如上开启配置后还需要对具体方法添加 //@Cacheable("books") 备注
    //开启缓存之后只会等待前面两条数据的输出时间, 后面4条会瞬间输出(启动应用看效果)
    @Override
    public void run(String... args) throws Exception {
        logger.info("因为 @Order(1) 注解,这个信息会再AppRuner2.java信息之前输出");
        logger.info(".... Fetching books");
        logger.info("isbn-1234 -->" + bookDao.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookDao.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookDao.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookDao.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookDao.getByIsbn("isbn-1234"));
        logger.info("isbn-1234 -->" + bookDao.getByIsbn("isbn-1234"));
    }

}
